package ar.com.gals.service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import ar.com.gals.domain.Articulo;
import ar.com.gals.domain.Equivalencia;
import ar.com.gals.domain.Observacion;
import ar.com.gals.error.GalsError;
import ar.com.gals.error.GalsException;
import ar.com.gals.filter.ArticuloFiltro;
import ar.com.gals.repository.ArticuloRepository;
import ar.com.gals.repository.EquivalenciaRepository;
import ar.com.gals.repository.ObservacionRepository;


public class ArticuloService extends AbstractService<Articulo> {

	
	public ArticuloService() {
		this.domain = Articulo.class;
	}
	
	
	public Articulo getById(int id) throws GalsException {
		
		Articulo object = null; 
		
		try
		{
			this.beginTransaction();
			
			object = (Articulo) new ArticuloRepository(this.session).getById(id);
			
			this.commit();
		}
		catch(Exception e) {
			
			this.rollback();
			
			throw new GalsException(e.getMessage());
		}
		
		return object;
	}
	
	
	public List<Articulo> getAll(ArticuloFiltro filtro, boolean fullLoad) throws GalsException {

		List<Articulo> list = null;
		
		try
		{
			this.beginTransaction();
		
			list = new ArticuloRepository(this.session).getAll(filtro, fullLoad);
			
			this.commit();
		}
		catch(Exception e) {
			
			this.rollback();
			
			throw new GalsException(e.getMessage());
		}
		
		return list;
	}


	@Override
	protected void executeUpdate(Articulo articulo) throws GalsException {
		
		List<GalsError> errors = new ArrayList<GalsError>();	
		ObservacionRepository observacionRepository = new ObservacionRepository(this.session);
		EquivalenciaRepository equivalenciaRepository = new EquivalenciaRepository(this.session);
		
		this.validarEquivalencias(articulo, errors);
		
		if(!errors.isEmpty())
			throw new GalsException(errors);
		
		for(Observacion observacion : articulo.getObservaciones())
			if(observacion.getId() == 0)
				observacionRepository.create(observacion);
			else
				observacionRepository.update(observacion);
			
		
		for(Equivalencia equivalencia : articulo.getEquivalencias())
			if(equivalencia.getId() == 0)
				equivalenciaRepository.create(equivalencia);
			else
				equivalenciaRepository.update(equivalencia);
		
		super.executeUpdate(articulo);
	}

	
	private void validarEquivalencias(Articulo articulo, List<GalsError> errors) {

		List<String> list = new ArrayList<String>();
		
		for(Equivalencia equivalencia : articulo.getEquivalencias()) {
			list.add(equivalencia.getTipoEquivalencia().getNombre());
		}
		
		if(new HashSet<String>(list).size() < list.size())
			errors.add(new GalsError("Extisten tipos de equivalencia repetidos"));
	}

	@SuppressWarnings("unused")
	private void validarObservaciones(Articulo articulo, List<GalsError> errors) {
		
		List<String> list = new ArrayList<String>();
		
		for(Observacion observacion : articulo.getObservaciones()) {
			list.add(observacion.getTipoObservacion().getNombre());
		}
		
		if(new HashSet<String>(list).size() < list.size())
			errors.add(new GalsError("Extisten tipos de observaci&oacute;n repetidos"));		
	}
}
